雖然今天加班比較晚,還是要比照鐵人精神,完成今天的挑戰...
Docker Compose yaml的起手式,我想從編輯器開始。
不是為了混一篇文章的量XD而是實際撰寫上,常常因為yaml的層級跟空白,而發生無法正常運作的問題。
這邊推薦使用vs code的docker extension,就可以提供Dockerfile還有Docker compose yaml的一些語法輔助。
有關Docker Compose yaml比較完整的說明,可以看以下官方文件:
https://docs.docker.com/compose/compose-file/06-networks/
網路的元件宣告還算簡單
version: "3"
services:
ubuntu:
image: tedyang/ubuntu:1120912
networks:
- outside
networks:
outside:
external: true
我們先來玩一下一個簡單範例,上面的範例就是用vs code跟參考官方範例寫成的。
後面我會花一點時間整理docker compose文件的結構跟語法的特色。
這邊試著run看看
docker-compose -f docker-compose.yaml -p ubuntutest up
官方文件有說明,external代表是在不在這邊管network物件,所以如果outside這個物件沒有先建立好,這邊會出現錯誤
我們先把network物件outside建立起來看看
docker network create outsude
再執行一次
docker-compose -f docker-compose.yaml -p ubuntutest up
ok了
我們看一下internal跟external的差異:
docker network ls
差異很簡單,external就是要先額外建好,internal代表docker compose執行同時,會建立一個project-name_network-object的網路物件。
這邊有發現一個狀況:
我重複執行了:
docker-compose -f docker-compose.yaml -p ubuntutest2 up
docker-compose -f docker-compose.yaml -p ubuntutest2 up
docker-compose -f docker-compose.yaml -p ubuntutest2 up
還是只有一個container在運作,相同container name。
這跟使用docker run --name這種方式不同,我整理如下:
剛剛只展示將project都寫一樣,執行時就會不斷重啟,但如果我進入compose yaml修改service name,但project name一樣,舊的service name的container會造成以下訊息:
可以看到多次執行會出現
WARN[0000] Found orphan containers ([ubuntutest2-ubuntu-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
如果確定舊的service不要使用了,可以照它的指示移除孤兒container
docker-compose -f docker-compose.yaml -p ubuntutest2 up --remove-orphans
後面會再更深入做docker compose生命週期的管理,然後會建議怎樣改service name或project name,或是使用docker-compose up /down來做重新deploy,不過我們還是著重在network的管理上喔。